﻿'Nombre:                         AdministracionVentana
'Descripcion:                    Ventana la cual permite la administracion del catalogo de cuentas
'Dependencias:                 
'Fecha de creación:              20090425 
'Autor:                          VMORALES
'Fecha de modifcación:         
'Responsable:                  
'Num. de modifcación:            0

Option Explicit On
Option Strict On

#Region "Imports"

Imports Electrocucaracha.AdminPersonal.DAO
Imports Electrocucaracha.AdminPersonal.DAO.Entidades.CuentaDTO
Imports System.Windows.Forms

#End Region

Namespace Cuenta

    ''' <summary>
    ''' Ventana la cual permite la administracion del catalogo de cuentas
    ''' </summary>
    Partial Public Class AdministracionVentana

#Region "Constantes"

#End Region

#Region "Miembros"

        Public Event CuentaCambiada()
        Private _cuenta As Entidades.CuentaDTO = Nothing
        Private Shared _instancia As AdministracionVentana

#End Region

#Region "Propiedades"

        Public Shared ReadOnly Property Instancia() As AdministracionVentana
            Get
                If _instancia Is Nothing Then
                    _instancia = New AdministracionVentana
                End If

                Return _instancia
            End Get
        End Property

#End Region

#Region "Constructores"

        Private Sub New()

            ' This call is required by the Windows Form Designer.
            InitializeComponent()

            ' Add any initialization after the InitializeComponent() call.

        End Sub

#End Region

#Region "Funciones"

        Private Sub CargarCuentas()
            With Me.cmbCuentas
                .ItemsSource = Cuenta.Manejador.Cuentas
                .SelectedValuePath = "Id"
            End With

            LimpiarTextos()
            HabilitarBotones(False)
        End Sub


        ''' <summary>
        ''' Funcion que carga los titulares activos de registrados en la base de datos
        ''' </summary>
        Private Sub CargarTitulares()
            With Me.cmbTitulares
                .ItemsSource = Titular.Manejador.TitularesActivos
                .SelectedValuePath = "Id"
            End With

            SeleccionarTitular()
        End Sub

        ''' <summary>
        ''' Funcion que carga los bancos activos de registrados en la base de datos
        ''' </summary>
        Private Sub CargarBancos()
            With Me.cmbBancos
                .ItemsSource = Banco.Manejador.BancosActivos
                .SelectedValuePath = "Id"
            End With

            SeleccionarBanco()
        End Sub

        ''' <summary>
        ''' Funcion que resetea los campos de texto
        ''' </summary>
        Private Sub LimpiarTextos()
            Me.cmbCuentas.SelectedValue = Nothing
            CargarTitulares()
            Me.txtDescripcion.Text = String.Empty
            Me.txtNumCuenta.Text = String.Empty
            Me.dtFechaCreacion.Text = String.Empty
            CargarBancos()
            Me.chkActivo.IsChecked = False
        End Sub

        ''' <summary>
        ''' Funcion que habilita o deshabilita los controles de edicion del formulario
        ''' </summary>
        ''' <param name="_habilitar">Verdadero en caso de habilitar, falso en caso contrario</param>
        Private Sub HabilitarBotones(ByVal _habilitar As Boolean)
            Me.btnAplicar.IsEnabled = _habilitar
            Me.btnEliminar.IsEnabled = _habilitar
        End Sub

        ''' <summary>
        ''' Funcion que valida que dentro de los campos de texto se encuentren datos
        ''' </summary>
        ''' <returns>Verdadero en caso de que todos los campos sean validos, falso en caso contrario</returns>
        Private Function ValidacionCampos() As Boolean
            Dim resultado As Boolean = True

            If resultado And Me.cmbTitulares.SelectedValue Is Nothing Then
                MessageBox.Show("No se ha especificado un titular en especifico", "Informacion incompleta", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                Me.cmbTitulares.Focus()
                resultado = False
            End If

            If resultado And String.IsNullOrEmpty(Me.txtDescripcion.Text) Then
                MessageBox.Show("No se ha especificado una descripcion en especifica", "Informacion incompleta", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                Me.txtDescripcion.Focus()
                resultado = False
            End If

            If resultado And String.IsNullOrEmpty(Me.txtNumCuenta.Text) Then
                MessageBox.Show("No se ha especificado un numero de cuenta especifica", "Informacion incompleta", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                Me.txtNumCuenta.Focus()
                resultado = False
            End If

            If resultado And Me.dtFechaCreacion.SelectedDate Is Nothing Then
                MessageBox.Show("No se ha especificado una fecha de creacion especifica", "Informacion incompleta", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                Me.dtFechaCreacion.Focus()
                resultado = False
            End If

            If resultado And Me.cmbBancos.SelectedValue Is Nothing Then
                MessageBox.Show("No se ha especificado un banco en especifico", "Informacion incompleta", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                Me.cmbBancos.Focus()
                resultado = False
            End If

            ValidacionCampos = resultado
        End Function

        ''' <summary>
        ''' Funcion que crea un objeto de tipo cuenta a partir de los campos del formulario
        ''' </summary>
        ''' <returns>Objeto de tipo cuenta</returns>
        Private Function CrearObjeto() As Entidades.CuentaDTO
            Dim cuenta As New Entidades.CuentaDTO()

            With cuenta
                If Not _cuenta Is Nothing Then
                    .Id = Me._cuenta.Id
                End If
                .Titular = DirectCast(Me.cmbTitulares.SelectedItem, Entidades.TitularDTO)
                .Banco = DirectCast(Me.cmbBancos.SelectedItem, Entidades.BancoDTO)
                .Descripcion = Me.txtDescripcion.Text.Trim()
                .NumCuenta = Me.txtNumCuenta.Text.Trim()
                .FechaCreacion = Me.dtFechaCreacion.SelectedDate.Value
                .Activo = Me.chkActivo.IsChecked.Value
            End With

            CrearObjeto = cuenta
        End Function

        ''' <summary>
        ''' Funcion que carga el titular asignado en la creacion de la ventana
        ''' </summary>
        Private Sub CargarObjeto()
            If _cuenta Is Nothing Then
                SeleccionarCuenta()
                SeleccionarTitular()
                SeleccionarBanco()
                HabilitarBotones(False)
            Else
                With _cuenta
                    Me.cmbTitulares.SelectedValue = .Titular.Id
                    Me.txtDescripcion.Text = .Descripcion
                    Me.txtNumCuenta.Text = .NumCuenta
                    Me.dtFechaCreacion.SelectedDate = .FechaCreacion
                    Me.cmbBancos.SelectedValue = .Banco.Id
                    Me.chkActivo.IsChecked = .Activo
                End With
                HabilitarBotones(True)
            End If
        End Sub

        ''' <summary>
        ''' Funcion que carga la cuenta con la que actualmente se esta trabajando
        ''' </summary>
        Private Sub SeleccionarCuenta()
            If Not Manejador.Seleccion Is Nothing Then
                LimpiarTextos()
                Me.cmbCuentas.SelectedValue = Manejador.Seleccion.Id
            End If
        End Sub

        ''' <summary>
        ''' Funcion que carga el titular con el que actualmente se encuentra trabajando
        ''' </summary>
        Private Sub SeleccionarTitular()
            If Not Titular.Manejador.Seleccion Is Nothing Then
                Me.cmbTitulares.SelectedValue = Titular.Manejador.Seleccion.Id
            End If
        End Sub

        ''' <summary>
        ''' Funcion que carga el banco con el que actualmente se encuentra trabajando
        ''' </summary>
        Private Sub SeleccionarBanco()
            If Not Banco.Manejador.Seleccion Is Nothing Then
                Me.cmbBancos.SelectedValue = Banco.Manejador.Seleccion.Id
            End If
        End Sub

#End Region

        Private Sub AdministracionVentana_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles Me.Closing
            e.Cancel = True
            Me.Hide()
        End Sub

        Private Sub CreacionControl_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded
            CargarCuentas()
            CargarTitulares()
            CargarObjeto()

            AddHandler Manejador.CuentasCambiadas, AddressOf CargarCuentas
            AddHandler Titular.Manejador.TitularesActivosCambiados, AddressOf CargarTitulares
            AddHandler Banco.Manejador.BancosActivosCambiados, AddressOf CargarBancos
            AddHandler Cuenta.Manejador.CuentaCambiada, AddressOf SeleccionarCuenta
            AddHandler Titular.Manejador.TitularCambiado, AddressOf SeleccionarTitular
        End Sub

        Private Sub btnAplicar_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnAplicar.Click
            If ValidacionCampos() Then
                Dim cuentaTemp As Entidades.CuentaDTO = CrearObjeto()
                If Cuenta.Manejador.Dao.Actualizar(cuentaTemp) Then
                    RaiseEvent CuentaCambiada()
                End If
            End If
        End Sub

        Private Sub btnEliminar_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnEliminar.Click
            If Not _cuenta Is Nothing Then
                Dim respuesta As DialogResult = MessageBox.Show(String.Format("¿Desea eliminar la cuenta {0} y toda su informacion asociada?", _cuenta.Descripcion), "Confirmacion", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1)
                If respuesta = Forms.DialogResult.Yes AndAlso Cuenta.Manejador.Dao.Eliminar(_cuenta) Then
                    RaiseEvent CuentaCambiada()
                End If
            End If
        End Sub

        Private Sub btnAgregar_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnAgregar.Click
            If ValidacionCampos() Then
                _cuenta = CrearObjeto()
                If Cuenta.Manejador.Dao.Agregar(_cuenta) Then
                    CargarCuentas()
                    RaiseEvent CuentaCambiada()
                End If
            End If
        End Sub

        Private Sub cmbCuentas_SelectionChanged(ByVal sender As Object, ByVal e As System.Windows.Controls.SelectionChangedEventArgs)
            If Not cmbCuentas.SelectedItem Is Nothing Then
                _cuenta = DirectCast(cmbCuentas.SelectedItem, Entidades.CuentaDTO)
                CargarObjeto()
            End If
        End Sub

        Private Sub btnTitulares_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnTitulares.Click
            Dim w As Titular.AdministracionVentana = Titular.AdministracionVentana.Instancia

            With w
                AddHandler .TitularCambiado, AddressOf CargarTitulares
                .Show()
                .Focus()
            End With
        End Sub

        Private Sub btnBancos_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnBancos.Click
            Dim w As Banco.AdministracionVentana = Banco.AdministracionVentana.Instancia

            With w
                AddHandler .BancoCambiado, AddressOf CargarBancos
                .ShowDialog()
                .Focus()
            End With
        End Sub

        Private Sub btnCerrar_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnCerrar.Click
            Me.Close()
        End Sub
    End Class

End Namespace